home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / preccx / prccx240.lha / atexit.c next >
C/C++ Source or Header  |  1993-05-27  |  749b  |  34 lines

  1. typedef void (* atexit_t)(void);
  2.  
  3. #ifndef ATEXIT_MAX
  4. #define ATEXIT_MAX 32
  5. #endif
  6. #ifndef NULL
  7. #define NULL 0
  8. #endif
  9.  
  10. int atexit(f)
  11. /* we'll register f in a stack, spawn a continuation process,
  12.  * and execute f when it exits, having junked as much of
  13.  * ourself as possible in the meantime.
  14.  */
  15. atexit_t f;
  16. {
  17.     static atexit_t flist[ATEXIT_MAX];
  18.     static int fptr, pid;
  19.  
  20.     if(fptr>=ATEXIT_MAX)
  21.         return(1);
  22.     flist[fptr++]=f;
  23.  
  24.     switch(pid=vfork()){
  25.     case 0:     /* we're the child - just continue */
  26.         return 0;
  27.     default:    /* we're the parent*/
  28.         waitpid(pid,NULL,0); /* for the child to finish */
  29.         flist[--fptr]();    /* now clean up */
  30.         exit(0);/* and go home happy? */
  31.         return 0;
  32.     }
  33. }
  34.